#1 添加cmake版本说明
cmake_minimum_required(VERSION 3.1.3)
#2 声明工程名称
project(message_server)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
#3 检测并生成proto框架代码
#   1 添加所需的proto框架代码文件名称
set(proto_path ${CMAKE_CURRENT_SOURCE_DIR}/../proto/) #CMAKE_CURRENT_SOURCE_DIR 表示 CMakeLists.txt 所在目录
set(proto_files base.proto file.proto user.proto message.proto)
#   2 检查框架代码文件是否生成
set(proto_srcs "")
set(proto_hxx "") #设置变量
set(proto_cxx "") #设置变量
foreach(proto_file ${proto_files})
#   3 如果没有生成，则预定义生成指令 -- 用于在构建项目之前生成框架代码
    string(REPLACE ".proto" ".pb.cc" proto_cxx ${proto_file}) #将.hxx替换为-proto.hxx，存于变量proto_hxx，要被替换的文件是proto_file
    string(REPLACE ".proto" ".pb.h" proto_hxx ${proto_file})
    if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${proto_cxx}) #CMAKE_CURRENT_BINARY_DIR表示cmake执行命令时所在的工作路径
        #proto -d mysql --generate-query --generate-schema --profile boost/date-time student.hxx
        #执行外部指令
        add_custom_command(
            PRE_BUILD #表示在所有其他步骤之前执行自定义命令
            COMMAND protoc #要执行的指令名称
            ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} -I ${proto_path} ${proto_path}/${proto_file} #要执行的指令运行参数选项
            DEPENDS ${proto_path}/${proto_file} #指定命令的依赖项,源码文件
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${proto_cxx} #指定要生成的目标名称
            COMMENT "生成proto框架代码文件：" ${proto_cxx} #执行命令时要打印的内容
            )
        endif()
#   4 将所有生成的框架代码文件名称保存起来
    list(APPEND proto_srcs ${CMAKE_CURRENT_BINARY_DIR}/${proto_cxx}) #所有的.cxx文件保存起来
endforeach()

# 3. 检测并生成ODB框架代码
#   1. 添加所需的odb映射代码文件名称
set(odb_path ${CMAKE_CURRENT_SOURCE_DIR}/../odb/)
set(odb_files message.hxx)
#   2. 检测框架代码文件是否已经生成
set(odb_hxx "")
set(odb_cxx "")
set(odb_srcs "")
foreach(odb_file ${odb_files})
#   3. 如果没有生成，则预定义生成指令 -- 用于在构建项目之间先生成框架代码
    string(REPLACE ".hxx" "-odb.hxx" odb_hxx ${odb_file})
    string(REPLACE ".hxx" "-odb.cxx" odb_cxx ${odb_file})
    if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}${odb_cxx})
        add_custom_command(
            PRE_BUILD
            COMMAND odb
            ARGS -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file}
            DEPENDS ${odb_path}/${odb_file}
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
            COMMENT "生成ODB框架代码文件:" ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}
        )
    endif()
#   4. 将所有生成的框架源码文件名称保存起来 student-odb.cxx classes-odb.cxx
    list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
endforeach()

#4 获取源码目录下的所有源码文件
set(src_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)
#5 声明目标及依赖
add_executable(message_server ${proto_srcs} ${src_files} ${odb_srcs})

#获取客户端源文件
set(client_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/test client_files)
add_executable(message_client ${proto_srcs} ${client_files})

#6 设置头文件默认搜索路径
include_directories(${CMAKE_CURRENT_BINARY_DIR}/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../odb/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../third)
#7 设置要连接的库
target_link_libraries(message_server ${target} -lamqpcpp -lev -lhiredis -lredis++ -lalibabacloud-sdk-core -lelasticlient -lcpr -lodb-mysql -lodb -lodb-boost -lgflags -lspdlog -lfmt -lbrpc -lssl -lcrypto -lprotobuf -lleveldb -letcd-cpp-api -lcpprest -lcurl /usr/lib/x86_64-linux-gnu/libjsoncpp.so.19)

target_link_libraries(message_client ${target} -lgtest -lgflags -lspdlog -lfmt -lbrpc -lssl -lcrypto -lprotobuf -lleveldb -letcd-cpp-api -lcpprest -lcurl /usr/lib/x86_64-linux-gnu/libjsoncpp.so.19)

#设置安装路径为bin
INSTALL(TARGETS message_server message_client RUNTIME DESTINATION bin)
